#pragma once
#include "Connection.hpp"
#include "HanderRequest.hpp"
#include "epollServer.hpp"
#include <sys/epoll.h>
class NormalSockHander
{
    public:
    static void Recv(std::shared_ptr< Connection> connt)
    {   
        char buffer[1024];
        while(1)
        {
            int n = recv(connt->GetFd(),buffer,1024,0);
            if(n>0)
            {
                for(int i = 0;i<n;i++)
                {
                    connt->_read_buf.push_back(buffer[i]);
                }
                continue;
            }
            else
            {
                if(errno == EAGAIN)
                {
                    errno = 0;
                    break;
                }
                else if(EINTR == errno)
                {
                    continue;
                }
                else
                {
                    Excepter(connt);
                    return ;
                }
            }
        }
        //这里进行数据处理
        
        return ;
    }   
    //对于epoll这种多路转接，一般来说写都是空的，只有写满了，才让epoll来管理
    static void Send(std::shared_ptr<Connection> connt)
    {   
        while(1)
        {
            int n = send(connt->GetFd(),connt->_write_buf.data(),connt->_write_buf.size(),0);//前面设置过套接字成非阻塞，这里就是非阻塞读取
            if(n>0)
            {
                connt->_write_buf.assign(connt->_write_buf.begin()+n,connt->_write_buf.end());
                //如果这次发完了，那就退出,说明操作系统内核由缓冲区了，足够写，关闭epoll对写事件的监听.只保留需要的事件
                if(connt->_write_buf.empty())
                {
                    connt->_R->ModifyEvents(connt->GetFd(),connt->GetEvents() ^ EPOLLOUT);
                    return ;
                }
            } 
            else
            {
                if(errno == EAGAIN)
                {
                    //缓冲区满了，开启写事件关心
                    connt->_R->ModifyEvents(connt->GetFd(),connt->GetEvents() | EPOLLOUT);
                    errno = 0;
                    return ;
                }
                else if(errno = EINTR)
                {
                    continue;
                }
                else
                {
                    Excepter(connt);
                }

            }
        }
    }   
    static void Excepter(std::shared_ptr< Connection> connt)
    {
        connt->_R->DelConnection(connt->GetFd());
    }
};
